package org.goldfish.demo.apicall.analysis.code.upload.messager.impl.pdf;

import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Component
public class PDFProcessor {

    /**
     * 将PDF文件转换为图像列表
     *
     * @param pdfFile     PDF文件
     * @param imageFormat 图像格式 (e.g., "png", "jpg")
     * @param dpi         图像分辨率
     * @return 图像列表
     * @throws IOException IO异常
     */
    public List<BufferedImage> convertPDFToImages(File pdfFile, String imageFormat, int dpi) throws IOException {
        List<BufferedImage> images = new ArrayList<>();

        try (PDDocument document = PDDocument.load(pdfFile)) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);

            for (int page = 0; page < document.getNumberOfPages(); page++) {
                BufferedImage image = pdfRenderer.renderImageWithDPI(page, dpi);
                images.add(image);
            }
        }

        return images;
    }

    /**
     * 处理单个PDF文件，转换为图像文件列表
     *
     * @param pdfFile PDF文件
     * @return 图像文件列表
     * @throws IOException IO异常
     */
    public List<File> processSinglePDF(File pdfFile) throws IOException {
        log.info("开始处理PDF文件: {}", pdfFile.getName());
        List<BufferedImage> images = convertPDFToImages(pdfFile, "png", 150);
        List<File> imageFiles = new ArrayList<>();

        // 创建临时目录保存图像
        File tempDir = new File(System.getProperty("java.io.tmpdir"), "pdf_images");
        if (!tempDir.exists()) {
            tempDir.mkdirs();
        }

        for (int i = 0; i < images.size(); i++) {
            BufferedImage image = images.get(i);
            String fileName = pdfFile.getName().replace(".pdf", "") + "_page_" + (i + 1) + ".png";
            File imageFile = new File(tempDir, fileName);
            ImageIO.write(image, "png", imageFile);
            imageFiles.add(imageFile);
            log.debug("已保存图像: {}", imageFile.getAbsolutePath());
        }

        log.info("PDF文件 {} 转换完成，共生成 {} 张图片", pdfFile.getName(), images.size());
        return imageFiles;
    }

    /**
     * 处理文件夹中的所有PDF文件
     *
     * @param folder 文件夹
     * @return 所有PDF转换后的图像文件列表
     * @throws IOException IO异常
     */
    public List<File> processPDFsInFolder(File folder) throws IOException {
        log.info("开始处理文件夹中的PDF文件: {}", folder.getAbsolutePath());
        List<File> allImageFiles = new ArrayList<>();
        File[] pdfFiles = folder.listFiles((dir, name) -> name.toLowerCase().endsWith(".pdf"));

        if (pdfFiles != null) {
            log.info("找到 {} 个PDF文件", pdfFiles.length);
            for (File pdfFile : pdfFiles) {
                try {
                    List<File> imageFiles = processSinglePDF(pdfFile);
                    allImageFiles.addAll(imageFiles);
                } catch (IOException e) {
                    log.error("处理PDF文件 {} 时出错: {}", pdfFile.getName(), e.getMessage(), e);
                    throw e;
                }
            }
        }

        log.info("文件夹 {} 中的PDF处理完成，共生成 {} 张图片", folder.getName(), allImageFiles.size());
        return allImageFiles;
    }
}